<!DOCTYPE html>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=569722
-->
<head>
  <meta charset=UTF-8>
  <title>Test for Bug 569722</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=569722">Mozilla Bug 569722</a>
<p id="display"></p>
<div id="content">
  <svg width="400" height="200">
    <text x="0" y="100" style="font: 16px sans-serif">aaa</text>
  </svg>
</div>

<pre id="test">
<script class="testbody" type="application/javascript">
SimpleTest.waitForExplicitFinish();

function close(x, y, message) {
  ok(Math.abs(x - y) < 1e-4, message);
}

function runTest() {
  var text = document.querySelector("text");

  // get the original length
  var length = text.getComputedTextLength();

  // get the original glyph positions
  var startPositions = [],
      endPositions = [],
      extents = [];
  for (var i = 0; i < 3; i++) {
    startPositions.push(text.getStartPositionOfChar(i));
    endPositions.push(text.getEndPositionOfChar(i));
    extents.push(text.getExtentOfChar(i));
  }

  // widths should all be the same
  is(extents[0].width, extents[1].width);
  is(extents[0].width, extents[2].width);

  var checkCharNumAtPosition = function(x, y, i) {
    var p = document.querySelector("svg").createSVGPoint();
    p.x = x;
    p.y = y;
    is(text.getCharNumAtPosition(p), i, "getCharNumAtPosition(" + i + ")");
  };

  var checkPositions = function(start, end, width) {
    for (var i = 0; i < 3; i++) {
      // check their positions
      close(text.getStartPositionOfChar(i).x, start[i], "start position of glyph " + i);
      close(text.getEndPositionOfChar(i).x, end[i], "end position of glyph " + i);
      close(text.getExtentOfChar(i).x, start[i], "left edge of extent of glyph " + i);
      close(text.getExtentOfChar(i).width, width, "width of glyph " + i);
      checkCharNumAtPosition((start[i] + end[i]) / 2, 100, i);
    }
  }

  var w = extents[0].width;

  var doLengthAdjustSpacingTest = function() {
    // getComputedTextLength should return the sum of the advances, and since
    // we are just changing the positions of the glyphs, it should be the same
    // as without a textLength="" attribute
    close(text.getComputedTextLength(), length, "getComputedTextLength when lengthAdjust=\"spacing\"");

    // expected start and end positions of the glyphs
    var start = [0, 50 - w / 2, 100 - w];
    var end = [w, 50 + w / 2, 100];
    checkPositions(start, end, w);
  };

  // switch to adjust glyph positions, using the default value of lengthAdjust=""
  text.setAttribute("textLength", "100");
  doLengthAdjustSpacingTest();
  // then with an explicit lengthAdjust="spacing"
  text.setAttribute("lengthAdjust", "spacing");
  doLengthAdjustSpacingTest();

  // now test with lengthAdjust="spacingAndGlyphs"
  text.setAttribute("lengthAdjust", "spacingAndGlyphs");

  // now that each glyph is stretched, the total advance should be the textLength
  close(text.getComputedTextLength(), 100, "getComputedTextLength when lengthAdjust=\"spacingAndGlyphs\"");

  // expected start and end positions of the glyphs
  var start = [0, 33.3333, 66.6666];
  var end = [33.3333, 66.6666, 100];
  checkPositions(start, end, 33.3333);

  SimpleTest.finish();
}

window.addEventListener("load", runTest, false);
</script>
</pre>
</body>
</html>
